// variables
// version of library
LCB_version = 2.8;
// _mac : true = macintosh, false = other os
_mac = navigator.userAgent.indexOf('Mac') != -1;
// _ie512 : true = MSIE 5.12(mac), false = others
_ie512 = navigator.userAgent.indexOf('MSIE 5.12') != -1;
// _dom : kind of DOM.
//        IE4 = 1, IE5+ = 2, NN4 = 3, NN6+ = 4, others = 0
_dom = document.all ? (document.getElementById ? 2 : 1) : (document.getElementById ? 4 : (document.layers ? 3 : 0));
_createLayerNo = 0; // layer no.

function initCrossBrowserLib() {
	_mac = navigator.userAgent.indexOf('Mac') != -1;
	_ie512 = navigator.userAgent.indexOf('MSIE 5.12') != -1;
	_dom = document.all ? (document.getElementById ? 2 : 1) : (document.getElementById ? 4 : (document.layers ? 3 : 0));
	_createLayerNo = 0;
}
initCrossBrowserLib();


/* _____________________________________________________________________ */

function getWindowWidth() {
	if (_dom == 4 || _dom == 3) return window.innerWidth;
	if (_dom == 2 || _dom == 1) return document.body.clientWidth;
	return 0;
}

function getWindowHeight() {
	if (_dom == 4 || _dom == 3) return window.innerHeight;
	if (_dom == 2 || _dom == 1) return document.body.clientHeight;
	return 0;
}

function getWinXOffset() {
	if (_dom == 4) return window.scrollX;
	if (_dom == 2 || _dom == 1) return document.body.scrollLeft;
	if (_dom == 3) return window.pageXOffset;
	return 0;
}

function getWinYOffset() {
	if (_dom == 4) return window.scrollY;
	if (_dom == 2 || _dom == 1) return document.body.scrollTop;
	if (_dom == 3) return window.pageYOffset;
	return 0;
}

function getDivFromName(nm) {
	if (_dom == 4 || _dom == 2) return document.getElementById(nm);
	if (_dom == 1) return document.all(nm);
	if (_dom == 3) {
		var s = '';
		for (var i = 1; i < arguments.length; i++) s += 'document.layers.' + arguments[i] + '.';
		return eval(s + 'document.layers.' + nm);
	}
	return null;
}

function getDivName(div) {
	if (_dom == 4 || _dom == 2 || _dom == 1) return div.id;
	if (_dom == 3) return div.name;
	return '';
}

function createLayer(left, top, width, height, parentDiv) {
	var s = '';
	if (arguments.length > 5) {
		for (var i = 5; i < arguments.length; i++) s += arguments[i];
	}
	if (_dom == 4) {
		var divName = '_js_layer_' + _createLayerNo;
		_createLayerNo++;
		var pDiv = parentDiv ? parentDiv : document.body;
		var div = document.createElement('DIV');
		div.id = divName;
		div.setAttribute('style', 'position:absolute;left:' + left + ';top:' + top + (width > 0 ? (';width:' + width) : '') + (height > 0 ? (';height:' + height) : '') + ';visibility:hidden');
		var range = document.createRange();
		range.selectNodeContents(div);
		range.collapse(true);
		var cf = range.createContextualFragment(s);
		div.appendChild(cf);
		pDiv.appendChild(div);
		return div;
	}
	if (_dom == 2 || _dom == 1) {
		var adj = (_mac && !_ie512) ? ' ' : '';
		var divName = '_js_layer_' + _createLayerNo;
		_createLayerNo++;
		var ha = (height > 0) ? (';height:' + height) : '';
		var pDiv = parentDiv ? parentDiv : document.body;
		pDiv.insertAdjacentHTML('BeforeEnd', '<div id="' + divName + '" style="position:absolute;left:' + left + ';top:' + top + (width > 0 ? (';width:' + width) : ';width:1') + (height > 0 ? (';height:' + height) : '') + ';visibility:hidden;">' + s + '<\/div>' + adj);
		return document.all(divName);
	}
	if (_dom == 3) {
		var div = parentDiv ? (new Layer(width, parentDiv)) : (new Layer(width));
		if (height > 0) div.resizeTo(width, height);
		div.moveTo(left, top);
		if (s != '') {
			div.document.open('text/html', 'replace');
			div.document.write(s);
			div.document.close();
		}
		return div;
	}
	return null;
}

function createExLayer(url, left, top, width, height, parentDiv) {
	if (_dom == 4) {
		var divName = '_js_layer_' + _createLayerNo;
		_createLayerNo++;
		var pDiv = parentDiv ? parentDiv : document.body;
		var div = document.createElement('IFRAME');
		div.id = divName;
		div.name = divName;
		div.setAttribute('style', 'position:absolute;left:' + left + ';top:' + top + ';width:' + width + (height > 0 ? (';height:' + height) : '') + ';visibility:hidden');
		div.setAttribute('src', url);
		div.setAttribute('frameborder', 0);
		div.setAttribute('scrolling', 'no');
		pDiv.appendChild(div);
		return div;
	}
	if (_dom == 2 || _dom == 1) {
		var adj = (_mac && _ie512) ? ' ' : '';
		var bd, divName = '_js_layer_' + _createLayerNo;
		_createLayerNo++;
		var ha = (height > 0) ? (';height:' + height) : '';
		if (arguments.length > 5 && parentDiv) bd = parentDiv;
		else bd = document.body;
		bd.insertAdjacentHTML('BeforeEnd', '<div id="' + divName + '" style="position:absolute;left:' + left + ';top:' + top + ';width:' + width + ha + ';visibility:hidden;">' + '<iframe src="' + url + '" name="' + divName + '_if" ' + 'width=' + width + ' height=' + height + 'marginwidth=0 marginheight=0 ' + 'scrolling="no" frameborder="no">' + '<\/iframe>' + '<\/div>' + adj);
		return document.all(divName);
	}
	if (_dom == 3) {
		var div = parentDiv ? (new Layer(width, parentDiv)) : (new Layer(width));
		if (height > 0) div.resizeTo(width, height);
		div.moveTo(left, top);
		div.load(url, width);
		return div;
	}
	return null;
}

function getDivImage(div, imgName) {
	if (_dom == 4) return document.images[imgName];
	if (_dom == 2 || _dom == 1) return document.images(imgName);
	if (_dom == 3) return div.document.images[imgName];
	return null;
}

function getDivForm(div, frmName) {
	if (_dom == 4) return document.forms[frmName];
	if (_dom == 2 || _dom == 1) return document.forms(frmName);
	if (_dom == 3) return div.document.forms[frmName];
	return null;
}

function initDivPos(div) {
	if (_dom == 4) {
		div.style.left = div.offsetLeft + 'px';
		div.style.top = div.offsetTop + 'px';
	} else if (_dom == 2 || _dom == 1) {
		div.style.pixelLeft = div.offsetLeft;
		div.style.pixelTop = div.offsetTop;
	}
	return div;
}

function getDivLeft(div) {
	if (_dom == 4 || _dom == 2) return div.offsetLeft;
	if (_dom == 1) return div.style.pixelLeft;
	if (_dom == 3) return div.left;
	return 0;
}

function getDivTop(div) {
	if (_dom == 4 || _dom == 2) return div.offsetTop;
	if (_dom == 1) return div.style.pixelTop;
	if (_dom == 3) return div.top;
	return 0;
}

function moveDivTo(div, left, top) {
	if (_dom == 4) {
		div.style.left = left + 'px';
		div.style.top = top + 'px';
		return;
	}
	if (_dom == 2 || _dom == 1) {
		div.style.pixelLeft = left;
		div.style.pixelTop = top;
		return;
	}
	if (_dom == 3) {
		div.moveTo(left, top);
		return;
	}
}

function moveDivBy(div, left, top) {
	if (_dom == 4) {
		div.style.left = div.offsetLeft + left;
		div.style.top = div.offsetTop + top;
		return;
	}
	if (_dom == 2) {
		div.style.pixelLeft = div.offsetLeft + left;
		div.style.pixelTop = div.offsetTop + top;
		return;
	}
	if (_dom == 1) {
		div.style.pixelLeft += left;
		div.style.pixelTop += top;
		return;
	}
	if (_dom == 3) {
		div.moveBy(left, top);
		return;
	}
}

function scrollExlHItTo(exdiv, x) {
	if (_dom == 4) {
		frames[exdiv.id].scrollTo(x, frames[exdiv.id].scrollY);
		return;
	}
	if (_dom == 2 || _dom == 1) {
		frames(exdiv.id + '_if').scrollTo(x, frames(exdiv.id + '_if').document.body.scrollTop);
		return;
	}
	if (_dom == 3) {
		var dx = x - exdiv.clip.left,
			ch = exdiv.clip.width;
		exdiv.left -= dx;
		exdiv.clip.left = x;
		exdiv.clip.width = ch;
		return;
	}
	return;
}

function scrollExlVItTo(exdiv, y) {
	if (_dom == 4) {
		frames[exdiv.id].scrollTo(frames[exdiv.id].scrollX, y);
		return;
	}
	if (_dom == 2 || _dom == 1) {
		frames(exdiv.id + '_if').scrollTo(frames(exdiv.id + '_if').document.body.scrollLeft, y);
		return;
	}
	if (_dom == 3) {
		var dy = y - exdiv.clip.top,
			ch = exdiv.clip.height;
		exdiv.top -= dy;
		exdiv.clip.top = y;
		exdiv.clip.height = ch;
		return;
	}
	return;
}

function initDivSize(div) {
	if (_dom == 4) {
		// getComputedStyle is buggy in NN6, and wrong in Mozilla 0.8/9
		//
		// var style=document.defaultView.getComputedStyle(div,null);
		// div.style.width =style.getPropertyValue('width' );
		// div.style.height=style.getPropertyValue('height');
		//
		div.style.width = div.offsetWidth + 'px';
		div.style.height = div.offsetHeight + 'px';
		//
		// need border-width=0px, margin-width:0px
	} else if (_dom == 2 || _dom == 1) {
		div.style.pixelWidth = div.offsetWidth;
		div.style.pixelHeight = div.offsetHeight;
	}
	return div;
}

function getDivWidth(div) {
	if (_dom == 4 || _dom == 2) return div.offsetWidth;
	if (_dom == 1) return div.style.pixelWidth;
	if (_dom == 3) return div.clip.width;
	return 0;
}

function getDivHeight(div) {
	if (_dom == 4 || _dom == 2) return div.offsetHeight;
	if (_dom == 1) return div.style.pixelHeight;
	if (_dom == 3) return div.clip.height;
	return 0;
}

function resizeDivTo(div, width, height) {
	if (_dom == 4) {
		div.style.width = width + 'px';
		div.style.height = height + 'px';
		return;
	}
	if (_dom == 2 || _dom == 1) {
		div.style.pixelWidth = width;
		div.style.pixelHeight = height;
		return;
	}
	if (_dom == 3) {
		div.resizeTo(width, height);
		return;
	}
}

function resizeDivBy(div, width, height) {
	if (_dom == 4) {
		div.style.width = (div.offsetWidth + width) + 'px';
		div.style.height = (div.offsetHeight + height) + 'px';
		return;
	}
	if (_dom == 2) {
		div.style.pixelWidth = div.offsetWidth + width;
		div.style.pixelHeight = div.offsetHeight + height;
		return;
	}
	if (_dom == 1) {
		div.style.pixelWidth += width;
		div.style.pixelHeight += height;
		return;
	}
	if (_dom == 3) {
		div.resizeBy(width, height);
		return;
	}
}

function getExlWidth(exdiv) {
	if (_dom == 4)
	// NN6 is buggy( same exdiv.offsetWidth )
	return exdiv.contentDocument.body.offsetWidth;
	if (_dom == 2 || _dom == 1) return _mac ? frames(exdiv.id + '_if').document.body.offsetWidth : frames(exdiv.id + '_if').document.body.scrollWidth;
	if (_dom == 3) return exdiv.document.width;
	return 0;
}

function getExlHeight(exdiv) {
	if (_dom == 4) return exdiv.contentDocument.body.offsetHeight;
	if (_dom == 2 || _dom == 1) return _mac ? frames(exdiv.id + '_if').document.body.offsetHeight : frames(exdiv.id + '_if').document.body.scrollHeight;
	if (_dom == 3) return exdiv.document.height;
	return 0;
}

function setDivVisibility(div, visible) {
	if (_dom == 4 || _dom == 2 || _dom == 1) {
		div.style.visibility = (visible) ? 'inherit' : 'hidden';
		return;
	}
	if (_dom == 3) {
		div.visibility = (visible) ? 'inherit' : 'hide';
		return;
	}
}

function setDivVisibilities(divs, visible) {
	if (_dom == 4 || _dom == 2 || _dom == 1) {
		for (var i = 0; i < divs.length; i++)
		divs[i].style.visibility = (visible) ? 'inherit' : 'hidden';
	}
	if (_dom == 3) {
		for (var i = 0; i < divs.length; i++)
		divs[i].visibility = (visible) ? 'inherit' : 'hide';
	}
	return divs;
}

function setDivClip(div, top, right, bottom, left) {
	if (_dom == 4 || _dom == 2 || _dom == 1) {
		div.style.clip = 'rect(' + top + 'px ' + right + 'px ' + bottom + 'px ' + left + 'px)';
		return;
	}
	if (_dom == 3) {
		div.clip.top = top;
		div.clip.right = right;
		div.clip.bottom = bottom;
		div.clip.left = left;
		return;
	}
}

function writeDivHTML(div, op, cl) {
	var s = '';
	for (var i = 3; i < arguments.length; i++) s += arguments[i];
	if (_dom == 4) {
		if (op) {
			while (div.hasChildNodes()) div.removeChild(div.lastChild);
		}
		var range = document.createRange();
		range.selectNodeContents(div);
		range.collapse(true);
		var cf = range.createContextualFragment(s);
		div.appendChild(cf);
		return;
	}
	if (_dom == 2 || _dom == 1) {
		if (op) div.innerHTML = '';
		if (_mac && !_ie512) div.innerHTML += s;
		else div.insertAdjacentHTML('BeforeEnd', s);
		return;
	}
	if (_dom == 3) {
		if (op) div.document.open('text/html', 'replace');
		div.document.write(s);
		if (cl) div.document.close();
		return;
	}
}

function setDivBackgroundColor(div, color) {
	if (color == null) color = 'transparent';
	if (_dom == 3) div.bgColor = color;
	else div.style.backgroundColor = color;
}

function setDivBackgroundImage(div, url) {
	if (_dom == 3) div.background.src = url ? url : null;
	else div.style.backgroundImage = url ? ('url(' + url + ')') : 'none';
}

function setDivZIndex(div, order) {
	if (_dom == 4 || _dom == 2 || _dom == 1) {
		div.style.zIndex = order;
		return;
	}
	if (_dom == 3) {
		div.zIndex = order;
		return;
	}
}

function setDivStyleAttribute(div, nm, value) {
	if (_dom != 0 && _dom != 3) eval('div.style.' + nm + '=value');
	return div;
}

function changeExlURL(exdiv, url) {
	if (_dom == 4) {
		exdiv.setAttribute('src', url);
		return;
	}
	if (_dom == 2 || _dom == 1) {
		frames(exdiv.id + '_if').location.replace(url);
		return;
	}
	if (_dom == 3) {
		exdiv.load(url, exdiv.clip.width);
		return;
	}
	return;
}

function getLeftFromEvent(e) {
	if (_dom == 4) return e.clientX + window.scrollX;
	if (_dom == 2 || _dom == 1) return document.body.scrollLeft + window.event.clientX;
	if (_dom == 3) return e.pageX;
	return 0;
}

function getTopFromEvent(e) {
	if (_dom == 4) return e.clientY + window.scrollY;
	if (_dom == 2 || _dom == 1) return document.body.scrollTop + window.event.clientY;
	if (_dom == 3) return e.pageY;
	return 0;
}
/* ==============================================================
   << event handler service object >>
              for Netscape Navigator 4.0
              and Internet Explorer  4.0+
   Author : Shinichi Hagiwara
   Type   : library - free software
   history:
     09/17/2000 remake for my book
     06/24/2001 support Mozilla( NN6 )
   Require JS Lib
          : LibCrossBrowser.js  - Common functions for cross browser
   Copyright(C) 2000 ShinSoft. All rights reserved.
 ================================================================ */
_grabObj = null; // <0x90><0xe8><0x97>L<0x92><0x86><0x82><U+0303>I<0x83>u<0x83>W<0x83>F<0x83>N<0x83>g

// <0x83>C<0x83>x<0x83><0x93><0x83>g<0x90><0xa7><0x8c><0xe4><0x83>I<0x83>u<0x83>W<0x83>F<0x83>N<0x83>g

function EventCtrl(div) {
	this.div = div;
	this.type = '';
	this.mask = 0;
	this.pageX = 0;
	this.pageY = 0;
}

// <0x83>C<0x83>x<0x83><0x93><0x83>g<0x90><0xa7><0x8c><0xe4><0x83>I<0x83>u<0x83>W<0x83>F<0x83>N<0x83>g<0x82><U+030B><0xa4><0x97>p<0x89><0xbb><0x83><0x81><0x83>\<0x83>b<0x83>h
EventCtrl.prototype.linkCtrl = function (obj) {
	if (obj && !obj.eventCtrl) obj.eventCtrl = this;
	return this;
}
// <U+81D2>l<0x82><U+0310><U+0752><U+80C1><0x83>\<0x83>b<0x83>h
EventCtrl.prototype.setThreshold = function (threshold) {
	this.threshold = threshold;
	return this;
}

// <0x97>v<0x91>f<0x96><0xbc><0x82><0xa9><0x82><0xe7><0x90><0xe8><0x97>L<0x92><0x86><0x82><U+0303>C<0x83>x<0x83><0x93><0x83>g<0x90><0xa7><0x8c><0xe4><0x83>I<0x83>u<0x83>W<0x83>F<0x83>N<0x83>g<0x82><U+13F82><0xe9> IE<0x97>p<0x8a><U+0590><0x94>

function getCtrlFromElementIE(el, tagName) {
	for (; el; el = el.parentElement)
	if ((tagName == null || el.tagName == tagName) && el.eventCtrl) return el.eventCtrl;
	return null;
}

// <0x83>C<0x83>x<0x83><0x93><0x83>g<0x82><0xa9><0x82><0xe7><0x83>C<0x83>x<0x83><0x93><0x83>g<0x90><0xa7><0x8c><0xe4><0x83>I<0x83>u<0x83>W<0x83>F<0x83>N<0x83>g<0x82><U+13F82><0xe9><0x8a><U+0590><0x94>

function getCtrlFromEventIE(e, tagName) { // IE<0x97>p
	var ctrl = _grabObj;
	var event = window.event;
	var fromCtrl, toCtrl;
	if (ctrl == null) {
		var mask = 0,
			type = event.type;
		switch (type) {
		case 'mouseover':
			fromCtrl = getCtrlFromElementIE(event.fromElement, tagName);
			toCtrl = getCtrlFromElementIE(event.toElement, tagName);
			if (fromCtrl != toCtrl) ctrl = toCtrl;
			if (!ctrl || (ctrl.mask & 1) == 0) ctrl = null;
			break;
		case 'mouseout':
			fromCtrl = getCtrlFromElementIE(event.fromElement, tagName);
			toCtrl = getCtrlFromElementIE(event.toElement, tagName);
			if (fromCtrl != toCtrl) ctrl = fromCtrl;
			if (!ctrl || (ctrl.mask & 1) == 0) ctrl = null;
			break;
		case 'mousedown':
		case 'mousemove':
		case 'mouseup':
			ctrl = getCtrlFromElementIE(event.srcElement, tagName);
			if (ctrl && (ctrl.mask & 2) != 0) break;
		default:
			ctrl = null;
			break;
		}
	}
	if (ctrl) {
		ctrl.pageX = document.body.scrollLeft + event.clientX;
		ctrl.pageY = document.body.scrollTop + event.clientY;
		ctrl.type = event.type;
	}
	return ctrl;
}

function getCtrlFromEventNN4(e, tagName) { // NN4<0x97>p
	var ctrl = _grabObj;
	if (ctrl == null) ctrl = e.target.eventCtrl;
	if (ctrl) {
		var mask = 0;
		switch (e.type) {
		case 'mouseover':
		case 'mouseout':
			mask |= 1;
			break;
		case 'mousedown':
		case 'mousemove':
		case 'mouseup':
			mask |= 2;
			break;
		}
		if ((ctrl.mask & mask) != 0) {
			ctrl.pageX = e.pageX;
			ctrl.pageY = e.pageY;
			ctrl.type = e.type;
		} else ctrl = null;
	}
	return ctrl;
}

function getCtrlFromEventMz(e, tagName) { // Mozilla<0x97>p
	var ctrl = _grabObj;
	if (ctrl == null) {
		for (var t = e.target; t != null; t = t.parentNode) {
			if ((tagName == null || (t.nodeType == Node.ELEMENT_NODE && t.tagName == tagName)) && ('undefined' != typeof(t.eventCtrl))) {
				ctrl = t.eventCtrl;
				break;
			}
		}
	}
	if (ctrl) {
		ctrl.pageX = e.clientX + window.scrollX;
		ctrl.pageY = e.clientY + window.scrollY;
		ctrl.type = e.type;
	}
	return ctrl;
}

function getCtrlFromEventNop(e, tagName) {
	return null;
} // Dummy
getCtrlFromEvent = (_dom == 1 || _dom == 2) ? getCtrlFromEventIE : (_dom == 3 ? getCtrlFromEventNN4 : (_dom == 4 ? getCtrlFromEventMz : getCtrlFromEventNop));

// mouseover <0x83>n<0x83><0x93><0x83>h<0x83><0x89>

function ech_mouseover(e) {
	var ctrl = getCtrlFromEvent(e, null);
	if (ctrl && ctrl.mouseover && !ctrl.mouseoverState) {
		ctrl.mouseoverState = true;
		if (ctrl.mouseover) ctrl.mouseover(ctrl, ctrl.mouseoverClient);
	}
}

// mouseout <0x83>n<0x83><0x93><0x83>h<0x83><0x89>

function ech_mouseout(e) {
	var ctrl = getCtrlFromEvent(e, null);
	if (ctrl && ctrl.mouseover && ctrl.mouseoverState) {
		ctrl.mouseoverState = false;
		if (ctrl.mouseout) ctrl.mouseout(ctrl, ctrl.mouseoutClient);
	}
}

// mousedown <0x83>n<0x83><0x93><0x83>h<0x83><0x89>

function ech_mousedown(e) {
	var ctrl = getCtrlFromEvent(e, null);
	if (ctrl && !ctrl.dragging) {
		_grabObj = ctrl;
		ctrl.dragging = true;
		ctrl.dragged = false;
		ctrl.startX = ctrl.curX = ctrl.pageX;
		ctrl.startY = ctrl.curY = ctrl.pageY;
		if (ctrl.mousedown) ctrl.mousedown(ctrl, ctrl.mousedownClient);
		return false;
	}
	return true;
}

// mousemove <0x83>n<0x83><0x93><0x83>h<0x83><0x89>

function ech_mousemove(e) {
	var ctrl = getCtrlFromEvent(e, null);
	if (ctrl && ctrl.dragging) {
		if (ctrl.curX != ctrl.pageX || ctrl.curY != ctrl.pageY) {
			if (Math.abs(ctrl.pageX - ctrl.startX) > ctrl.threshold || Math.abs(ctrl.pageY - ctrl.startY) > ctrl.threshold) ctrl.dragged = true;
			if (ctrl.mousemove) ctrl.mousemove(ctrl, ctrl.mousemoveClient);
			ctrl.curX = ctrl.pageX;
			ctrl.curY = ctrl.pageY;
		}
		return false;
	}
	return true;
}

// mouseup <0x83>n<0x83><0x93><0x83>h<0x83><0x89>

function ech_mouseup(e) {
	var ctrl = getCtrlFromEvent(e, null);
	if (ctrl && ctrl.dragging) {
		_grabObj = null;
		ctrl.dragging = false;
		if (ctrl.mouseup) ctrl.mouseup(ctrl, ctrl.mouseupClient);
		if (!ctrl.dragged && ctrl.mouseclick) ctrl.mouseclick(ctrl, ctrl.mouseclickClient);
		ctrl.curX = ctrl.pageX;
		ctrl.curY = ctrl.pageY;
		return false;
	}
	return true;
}

/**
 * Set the drag object and the methods to call on the events
 *  - mouseover
 *  - mouseout
 * The method you pass should expect to get 2 params
 *  a) A ctrl-object holding all event info
 *  b) A pass-through parameter that *you* may set.
 *
 * @param div   is the object you intend to move (a div-object)
 * @param ovrf  function to call on the onmousedown event
 * @param ovrc  pass-through parameter that you *may* set
 * @param outf  function to call on the onmousemove event
 * @param outc  pass-through parameter that you *may* set
 */

function ech_attachMouseOverOut(div, ovrf, ovrc, outf, outc) {
	if (!div.eventCtrl) div.eventCtrl = new EventCtrl(div);
	var ctrl = div.eventCtrl;
	ctrl.mouseoverState = false;
	ctrl.mouseover = ovrf;
	ctrl.mouseoverClient = ovrc;
	ctrl.mouseout = outf;
	ctrl.mouseoutClient = outc;
	div.onmouseover = ech_mouseover;
	div.onmouseout = ech_mouseout;
	ctrl.mask |= 1;
	return ctrl;
}

// mouseover/mouseout <0x83>n<0x83><0x93><0x83>h<0x83><0x89><0x93>o<0x98>^<0x8d><U+D3DC><0x8a><U+0590><0x94>

function ech_detachMouseOverOut(div) {
	var ctrl = div.eventCtrl;
	if (ctrl) {
		ctrl.div.onmouseover = null;
		ctrl.div.onmouseout = null;
		ctrl.mask = ~1;
	}
}

/**
 * Set the drag object and the methods to call on the events
 *  - onmousedown
 *  - onmousemove
 *  - onmouseup
 *  - onmouseclick
 * The method you pass should expect to get 2 params
 *  a) A ctrl-object holding all event info
 *  b) A pass-through parameter that *you* may set.
 *
 * @param div   is the object you intend to move (a div-object)
 * @param dwnf  function to call on the onmousedown event
 * @param dwnc  pass-through parameter that you *may* set
 * @param movf  function to call on the onmousemove event
 * @param movc  pass-through parameter that you *may* set
 * @param upf   function to call on the onmouseup event
 * @param upc   pass-through parameter that you *may* set
 * @param clkf  function to call on the mouseclick event
 * @param clkc  pass-through parameter that you *may* set
 */

function ech_attachMouseDrag(div, dwnf, dwnc, movf, movc, upf, upc, clkf, clkc) {
	var doc;

	if (_dom == 1 || _dom == 2) {
		doc = div;
		doc.onmousedown = ech_mousedown;
		document.onmousemove = ech_mousemove;
		document.onmouseup = ech_mouseup;
	} else if (_dom == 3) {
		doc = div.document;
		doc.onmousedown = ech_mousedown;
		doc.onmousemove = ech_mousemove;
		doc.onmouseup = ech_mouseup;
		doc.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
	} else if (_dom == 4) {
		doc = div;
		div.onmousedown = ech_mousedown;
		document.body.onmousemove = ech_mousemove;
		document.body.onmouseup = ech_mouseup;
	} else
	return null;
	if (!doc.eventCtrl) doc.eventCtrl = new EventCtrl(div);
	var ctrl = doc.eventCtrl;
	ctrl.dragging = false;
	ctrl.dragged = false;
	ctrl.startX = 0;
	ctrl.startY = 0;
	ctrl.curX = 0;
	ctrl.curY = 0;
	ctrl.mousedown = dwnf;
	ctrl.mousedownClient = dwnc;
	ctrl.mousemove = movf;
	ctrl.mousemoveClient = movc;
	ctrl.mouseup = upf;
	ctrl.mouseupClient = upc;
	ctrl.mouseclick = clkf;
	ctrl.mouseclickClient = clkc;
	ctrl.threshold = 5;
	ctrl.mask |= 2;
	return ctrl;
}

// <0x83>h<0x83><0x89><0x83>b<0x83>O<0x83>n<0x83><0x93><0x83>h<0x83><0x89><0x93>o<0x98>^<0x8d><U+D3DC><0x8a><U+0590><0x94>

function ech_detachMouseDrag(div) {
	var ctrl = null;
	if (_dom == 1 || _dom == 2) {
		ctrl = div.eventCtrl;
		if (ctrl) ctrl.div.onmousedown = null;
	} else if (_dom == 3) {
		ctrl = div.document.eventCtrl;
		if (ctrl) {
			var doc = ctrl.div.document;
			doc.releaseEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
			doc.onmousedown = null;
			doc.onmousemove = null;
			doc.onmouseup = null;
		}
	} else if (_dom == 4) {
		ctrl = div.eventCtrl;
		if (ctrl) ctrl.div.onmousedown = null;
	}
	if (ctrl) ctrl.mask &= ~2;
}
